﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SIAD.Model
{
    /// <summary>
    /// Représente un joueur, permet d'ordonancer ses actions sur le plateau
    /// </summary>
    class Player : MessageSender, IPlay
    {
        #region Properties

        private IAStrategy _theStrategy;
        /// <summary>
        /// La strategie de jeu
        /// </summary>
        public IAStrategy theStrategy
        {
            get { return _theStrategy; }
            set
            {
                if (_theStrategy != value)
                {
                    _theStrategy = value;
                    _theStrategy.MessageEvent += new MessageSender.MessageEventHandler(_theStrategy_MessageEvent);
                }
            }
        }

        /// <summary>
        /// Reception d'un message de la stratégie
        /// </summary>
        /// <param name="sender">La strategie</param>
        /// <param name="e">le message</param>
        void _theStrategy_MessageEvent(object sender, MessageEventArg e)
        {
            this.sendMessage(e.MessageText); 
        }
        
        private String _thePlayerName;
        /// <summary>
        /// Le nom du joueur
        /// </summary>
        public String thePlayerName { get { return _thePlayerName; } }

        #endregion 

        #region Constructors
        /// <summary>
        /// Constructeur par défaut
        /// </summary>
        public Player(String theName, Plateau thePlateau, Common.CASE_TYPE thePlayer)
        {
            _thePlayerName = theName;   
            // utilisation exprès pour instancier automatiquement les event handler de message
            theStrategy = IAStrategyFactory.getInstance().createDefaultStrategy(thePlateau,thePlayer);
        }
        #endregion

        #region IPlay
        /// <summary>
        /// Méthode d'initialisation du jeu, permet de placer le joueur
        /// </summary>
        public void PlacePlayer()
        {
            _theStrategy.PlacePlayer();  
        }

        public void MovePlayer()
        {
            _theStrategy.MovePlayer();
        }

        public void DropBlock()
        {
            _theStrategy.DropBlock();
        }   

        public bool canMove()
        {           
            return _theStrategy.canMove();
        }
        #endregion
    }
}
